{"componentChunkName":"component---src-templates-blog-post-js","path":"/JPA/7_\bJQPL_ToBe/","result":{"data":{"site":{"siteMetadata":{"title":"Gomster","author":"Gomster","siteUrl":"https://gomster96.github.io","comment":{"disqusShortName":"","utterances":"gomster96/gomster96.github.io"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"b5548ac3-ecbb-59b5-9307-a8876dd44a57","excerpt":"JPQL이란? JPA를 사용하면 엔티티 객체를 중심으로 개발하게 된다. 하지만 이때 DB를 검색할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능 하므로, 결국 검색 조건이 포함된 SQL이 필요하다. JPA에서 제공하는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어이다. JPQL은 엔티티 객체를 대상으로 쿼리를 보낸다. 이후 이것이 번역되어 데이터베이스 테이블을 대상으로 쿼리를 보낸다. 위의 코드를 보면 알 수 있듯이 JPQL…","html":"<h1 id=\"jpql이란\" style=\"position:relative;\"><a href=\"#jpql%EC%9D%B4%EB%9E%80\" aria-label=\"jpql이란 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>JPQL이란?</h1>\n<p>JPA를 사용하면 엔티티 객체를 중심으로 개발하게 된다. 하지만 이때 DB를 검색할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능 하므로, 결국 검색 조건이 포함된 SQL이 필요하다.</p>\n<ul>\n<li>JPA에서 제공하는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어이다.</li>\n<li>JPQL은 엔티티 객체를 대상으로 쿼리를 보낸다. 이후 이것이 번역되어 데이터베이스 테이블을 대상으로 쿼리를 보낸다.</li>\n</ul>\n<p align=\"center\"><span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;\">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 18%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAqElEQVQY002PWRLDIAxDuVXYMSaBQNre/zYqkGXy8QZhC2GLnDOMMbDWQmsNbS60erSxGup1f3qX31yMuthrQ9kb1u0MDtHBk4V1Q3vwRuBMcMEisJ8QB1Dy0+fJzTej7rtHcFrRji9q+8zgdvx6eOm6IvXelityqeC0dV0QKWLv3hgZJUiwt1gWCTmQEkIpNUcfEw7GB5ETiAimr6DUudrtG+eNfumbPz0Ail+pKBDLAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"1\" title=\"1\" src=\"/static/6995d0f25837614377ce57dc773081bd/c1b63/1.png\" srcset=\"/static/6995d0f25837614377ce57dc773081bd/5a46d/1.png 300w,\n/static/6995d0f25837614377ce57dc773081bd/0a47e/1.png 600w,\n/static/6995d0f25837614377ce57dc773081bd/c1b63/1.png 1200w,\n/static/6995d0f25837614377ce57dc773081bd/d61c2/1.png 1800w,\n/static/6995d0f25837614377ce57dc773081bd/5b30f/1.png 2372w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span></p>\n<p>위의 코드를 보면 알 수 있듯이 JPQL은 일반 쿼리와 달리 <code class=\"language-text\">테이블이 아닌 entity를 대상</code>으로 from 절을 사용한다.</p>\n<h2 id=\"query-dsl\" style=\"position:relative;\"><a href=\"#query-dsl\" aria-label=\"query dsl permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Query DSL</h2>\n<ul>\n<li>문자가 아닌 자바코드로 JPQL을 작성할 수 있음</li>\n<li>JPQL 빌더 역할</li>\n<li>컴파일 시점에 문법 오류를 찾을 수 있음</li>\n<li>동적쿼리 작성이 편리하고, 단순하고 쉬우므로 실무에서 사용 권장</li>\n</ul>\n<p align=\"center\"><span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;\">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 55.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABxUlEQVQoz21S2XLbMAzURyWWRB08Rd2XJR9Jp9P//4otQMWuO8kDBgAJLhYLRmmaIi+yYEmSfLM4Jh+/nMXJD3XpM44KmcO1GvVokeUCaZpAZAIZNeCc74syRyLEcZ6n5FOk4vBcw0BZcdxHpSrhagPXWJhKwzgDZSSMV3Ru4XsXGmolYCuFdmxQd57qiETv0QweUkmqdZC6RLRd7rj/+oNlvaDrJyznC7bLB+Zlx7pd0dQDatdi8yW8UejHFf0ww9ct2m5E5alB26FpBxgiF7nK02UDpTSyLIOg0ayr0PYDtDHQJTGxLZQ0ECTH6fROdiJt4y//Lw4a5nkRABi4HyY0XR9iITIaRQVQbpIkxyNeIufsf7JIErPK1zTKjNvnb+zXDwzTgm4YMU4rjc1SjKER1zEBZsnMmBGDPDYcADl4f3uD0iY8kFLBN6TZ9Y5pOWOcV9S+xXm+YqCmNd0pV0NXDYHnT9YP4OiRsA4xa0LGQvNy5nXHeb9hmjeMzYKl37BMO0Za4LLfA7ix7gkWGL4mj5i3xkDHxm+0af4aGlZV0NLCEgibNjZM9g3wFYx9KekfUrGmYrZcxMcEXxs9/COO/9PyL5HVgfDZGnuKAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"2\" title=\"2\" src=\"/static/94e383cae113b0458650e52e99ec6fcf/c1b63/2.png\" srcset=\"/static/94e383cae113b0458650e52e99ec6fcf/5a46d/2.png 300w,\n/static/94e383cae113b0458650e52e99ec6fcf/0a47e/2.png 600w,\n/static/94e383cae113b0458650e52e99ec6fcf/c1b63/2.png 1200w,\n/static/94e383cae113b0458650e52e99ec6fcf/d61c2/2.png 1800w,\n/static/94e383cae113b0458650e52e99ec6fcf/7da7d/2.png 2120w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span></p>\n<h3 id=\"분석\" style=\"position:relative;\"><a href=\"#%EB%B6%84%EC%84%9D\" aria-label=\"분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>분석</h3>\n<ul>\n<li>JPAQueryFactory를 사용하여 QueryDSL 을 작성한다.</li>\n<li>.selectFrom(원하는Entity의 클래스) 를 통해 원하는 Entity를 선택한다.</li>\n<li>Configuration 을 통해 QueryDSL을 사용하기 위한 Q클래스가 필요하다(QMember)</li>\n<li>.where를 통해 원하는 조건을 넣을 수 있다.</li>\n<li>.orderBy를 통해 정렬을 할 수 있다.</li>\n</ul>\n<h1 id=\"jpql-기본-문법\" style=\"position:relative;\"><a href=\"#jpql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95\" aria-label=\"jpql 기본 문법 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>JPQL 기본 문법</h1>\n<p>JPQL은 객체지향 쿼리 언어로 엔티티 객체를 대상으로 쿼리하지만, 결국 SQL로 변환되어 테이블을 대상으로 쿼리를 날린다.</p>\n<p align=\"center\"><span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;\">\n      <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 83%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAABtElEQVQ4y52U164iMRBE5///hzcEiBxFzhmJnJPI1NVpadDdh10xa8k09niqq6va43S7XVUqFTWbTS0WCyWTSR2PRx0OB10uFzHe77e+HU69XlexWFS73dZ8PtdgMDDAzWbzf4D87Pd7xeNxZTIZTadTS8BkvF4veRkGCDMYjsdjTSYTk2C3233YeWYISLlcVqvVsv+xWOxzwAX7FtQA1+u1qtWqMAjQ7XZr5vxm6YnhbDYzhhjSaDS0XC6VSqWMrdeyDXA0Gn0A0RIw2obSS6WSJ3MMEKBcLqfhcGiGsKadSLJarbxrCBCAhULBJm5Ho1Frdsbz+fSmIZqhF0CUTAKMoS9Pp5N3hpSYz+dNOxqcpgY8FArZdXQ1dM3513T+lslLq/zBkMy3203X61X3+90iV5F9tCOyz70mPh4Pk8N9h8g5nrHvYEY2m1UgELA2oXzW7gei3++bDOFwWH6/33o2GAxav0YiETubSCRs3+fzyQHAnWSo1Wp2Q2ByPp/NIIzCNJgDwAeEW4XOGEpibhbR4QDZYUdWGpmPBeBEsvOcFzqdjtLptPUqa6pj3ev1rEIAfwBVlQsAsST9lAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;\"></span>\n  <img class=\"gatsby-resp-image-image\" alt=\"3\" title=\"3\" src=\"/static/4ecfad06265785f05634cb4010689a3f/c1b63/3.png\" srcset=\"/static/4ecfad06265785f05634cb4010689a3f/5a46d/3.png 300w,\n/static/4ecfad06265785f05634cb4010689a3f/0a47e/3.png 600w,\n/static/4ecfad06265785f05634cb4010689a3f/c1b63/3.png 1200w,\n/static/4ecfad06265785f05634cb4010689a3f/229ad/3.png 1356w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\" loading=\"lazy\">\n    </span></p>\n<h2 id=\"프로젝션\" style=\"position:relative;\"><a href=\"#%ED%94%84%EB%A1%9C%EC%A0%9D%EC%85%98\" aria-label=\"프로젝션 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>프로젝션</h2>\n<p>Select 절에 조회할 대상을 지정하는 것을 프로젝션이라고 한다. 아래 예시처럼 엔티티, 임베디드 타입, 스칼라 타입이 프로젝션의 대상이 될 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">SELECT m FROM <span class=\"token class-name\">Member</span> m  <span class=\"token comment\">//엔티티 프로젝션</span>\nSELECT m<span class=\"token punctuation\">.</span>team FROM <span class=\"token class-name\">Member</span> m <span class=\"token comment\">// Member안의 team 엔티티 프로젝션</span>\nSELECT m<span class=\"token punctuation\">.</span>address FROM <span class=\"token class-name\">Member</span> m  <span class=\"token comment\">// 임베디드타입 adress 프로젝션</span>\nSELECT m<span class=\"token punctuation\">.</span>username<span class=\"token punctuation\">,</span> m<span class=\"token punctuation\">.</span>age FROM <span class=\"token class-name\">Member</span> m <span class=\"token comment\">// 스칼라 타입 프로젝션 -> 이렇게 될 시에 Object[] 타입으로 조회하는 것이 편하다.</span></code></pre></div>\n<h3 id=\"결과-조회-api\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EA%B3%BC-%EC%A1%B0%ED%9A%8C-api\" aria-label=\"결과 조회 api permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결과 조회 API</h3>\n<ul>\n<li>\n<p>query.getResultList() 결과가 하나 이상일 때, 리스트를 반환</p>\n<ul>\n<li>결과가 없으면 빈 리스트 반환</li>\n</ul>\n</li>\n<li>\n<p>결과가 정확히 하나일 때 단일 객체 반환</p>\n<ul>\n<li>결과가 없거나 둘 이상이면 Exception이 발생하므로 사용에 관해선 논란이 많음</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"페이징-api\" style=\"position:relative;\"><a href=\"#%ED%8E%98%EC%9D%B4%EC%A7%95-api\" aria-label=\"페이징 api permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>페이징 API</h3>\n<ul>\n<li>setFirstResult(int startPosition) : 조회 시작위치</li>\n<li>setMaxResults(int maxResult) : 조회할 데이터 수</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// 페이징 API사용의 예시로 10번째 부터 최대 20개를 가지고온다.</span>\n<span class=\"token class-name\">String</span> jpql <span class=\"token operator\">=</span> <span class=\"token string\">\"select m from Member m order by m.name desc\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Member</span><span class=\"token punctuation\">></span></span> resultList <span class=\"token operator\">=</span> em<span class=\"token punctuation\">.</span><span class=\"token function\">createQuery</span><span class=\"token punctuation\">(</span>jpql<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Member</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">setFirstResult</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">setMaxResults</span><span class=\"token punctuation\">(</span><span class=\"token number\">20</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">getResultList</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"조건식\" style=\"position:relative;\"><a href=\"#%EC%A1%B0%EA%B1%B4%EC%8B%9D\" aria-label=\"조건식 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>조건식</h2>\n<h3 id=\"case-식\" style=\"position:relative;\"><a href=\"#case-%EC%8B%9D\" aria-label=\"case 식 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CASE 식</h3>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">select\n  <span class=\"token keyword\">case</span> when m<span class=\"token punctuation\">.</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">10</span> then <span class=\"token string\">'학생요금'</span>\n       when m<span class=\"token punctuation\">.</span>age <span class=\"token operator\">>=</span> <span class=\"token number\">60</span> then <span class=\"token string\">'경로요금'</span>\n       <span class=\"token keyword\">else</span> <span class=\"token string\">'일반요금'</span>\n  end\nfrom <span class=\"token class-name\">Member</span> m</code></pre></div>\n<h3 id=\"coalesce\" style=\"position:relative;\"><a href=\"#coalesce\" aria-label=\"coalesce permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>COALESCE</h3>\n<p>coalesce 는 하나씩 조회하여 null이 아니면 반환하는 조건식이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">select <span class=\"token function\">coalesce</span><span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">.</span>username<span class=\"token punctuation\">,</span> \"이름 없는 회원'<span class=\"token punctuation\">)</span> from <span class=\"token class-name\">Member</span> m</code></pre></div>\n<h3 id=\"nullif\" style=\"position:relative;\"><a href=\"#nullif\" aria-label=\"nullif permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>NULLIF</h3>\n<p>두 값이 같으면 null을 반환하고, 다르면 첫번째 값을 반환한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">select <span class=\"token function\">NULLIF</span><span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">.</span>username<span class=\"token punctuation\">,</span> <span class=\"token string\">'관리자'</span><span class=\"token punctuation\">)</span> from <span class=\"token class-name\">Member</span> m</code></pre></div>\n<h1 id=\"페치-조인-fetch-join\" style=\"position:relative;\"><a href=\"#%ED%8E%98%EC%B9%98-%EC%A1%B0%EC%9D%B8-fetch-join\" aria-label=\"페치 조인 fetch join permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>페치 조인 (fetch join)</h1>\n<p>페치조인은 JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 <code class=\"language-text\">엔티티나 컬렉션을 SQL 한 번에 함꼐 조회</code>하는 기능이다.</p>\n<ul>\n<li>이전에 LAZY로딩을 만들었던 것보다 우선적으로 적용하기 때문에 페치조인이 필요한 곳에서 사용하면 된다. (LAZY로딩으로 대부분의 테이블 관계를 만들기 때문에 )</li>\n<li>fetch.EAGER 와 비슷하다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">select t\nfrom <span class=\"token class-name\">Team</span> t join fetch t<span class=\"token punctuation\">.</span>members\nwhere t<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> <span class=\"token string\">'팀A'</span></code></pre></div>\n<p>t의 이름이 ‘팀A’인 엔티티들과 그때 t의 mebers까지 한번에 가져온다.</p>\n<p>위의 코드를 SQL로 번역하면 다음과 같다</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">SELECT <span class=\"token class-name\">T</span><span class=\"token punctuation\">.</span>*<span class=\"token punctuation\">,</span> <span class=\"token class-name\">M</span><span class=\"token punctuation\">.</span>*\nFROM TEAM <span class=\"token class-name\">T</span>\nINNER JOIN MEMBER <span class=\"token class-name\">M</span> ON <span class=\"token class-name\">T</span><span class=\"token punctuation\">.</span>ID<span class=\"token operator\">=</span><span class=\"token class-name\">M</span><span class=\"token punctuation\">.</span>TEMA_ID\nWHERE <span class=\"token class-name\">T</span><span class=\"token punctuation\">.</span>NAME <span class=\"token operator\">=</span> <span class=\"token string\">'팀A'</span></code></pre></div>\n<p>페치조인을 사용할 때 일대다 관계일 경우 데이터가 뻥튀기 될 수 있음을 주의해야한다.</p>\n<h1 id=\"reference\" style=\"position:relative;\"><a href=\"#reference\" aria-label=\"reference permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reference</h1>\n<ul>\n<li><a href=\"https://www.inflearn.com/course/ORM-JPA-Basic\">김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편</a></li>\n</ul>","frontmatter":{"title":"영속성 컨텍스트","date":"March 07, 2022"}}},"pageContext":{"slug":"/JPA/7_\bJQPL_ToBe/","previous":{"fields":{"slug":"/JPA/6_값타입/"},"frontmatter":{"title":"값 타입"}},"next":{"fields":{"slug":"/OODP/ChainOfResponsibility/"},"frontmatter":{"title":"역할 사슬 패턴 (Chain Of Responsibility)"}}}}}